#include "os_idle.h"
#include "os_sched.h"
#include "os_mem.h"
#include "os_task.h"

// 空闲任务的相关处理
static uint8_t idle_stack[OS_TASK_IDLE_STACK_SIZE];

/**
 * 空闲任务函数
 */
static void idle_task_entry (void * param) {
    for (;;) {
        // 回收任务结构，不断遍历，回收任务
#if OS_TASK_DEL_ENABLE
        os_task_t * del_task = os_sched_remove_deleted();        
        while (del_task != OS_NULL) {
            if (del_task == OS_NULL) {
                os_printf("del task == OS_NULL");
            }
            // 释放待删除任务所占用的资源, 如内存资源以及其它资源
            if (del_task->flags & OS_OBJECT_HEAP) {
                os_mem_free(del_task->start_stack);
                os_mem_free(del_task);
            }

            // 取下一任务
            del_task = os_sched_remove_deleted();
        }
#endif

        // 回调函数
#if OS_TASK_IDLE_HOOK_ENABLE    
        os_task_idle_hook();
#endif // OS_TASK_IDLE_HOOK_ENABLE
    }
}

/**
 * 初始化空闲任务
 */
os_err_t os_task_idle_init (void) {
    // 创建空闲任务, 使用静态方式创建，这样可不依赖堆
    os_err_t err = os_task_init(&os_core.idle_task,
                "idle", 
                idle_task_entry, 
                OS_NULL, 
                OS_TASK_PRIO_MAX, 
                idle_stack, 
                sizeof(idle_stack));
    if (err < 0) {
        os_dbg("create idle task failed.");
        return err;
    }

    os_task_start(&os_core.idle_task);
    return OS_ERR_OK;
}
